/**
 * 项目名称：
 * 设计实现手机卡、手机套餐等业务的类与接口。
 * 项目描述：
 * 按照要求设计并实现以下实体类和接口。
 * 2.1 第一步：设计和实现以下类
 * （1）手机卡类 特征：卡类型、卡号、用户名、密码、账户余额、通话时长(分钟)、上网流量 行为：显示（卡号 + 用户名 + 当前余额）
 * （2）通话套餐类 特征：通话时长、短信条数、每月资费 行为: 显示所有套餐信息
 * （3）上网套餐类 特征：上网流量、每月资费 行为：显示所有套餐信息
 * （4）用户消费信息类 特征：统计通话时长、统计上网流量、每月消费金额
 * 2.2 第二步：设计和实现以下枚举类 手机卡的类型总共有 3 种：大卡、小卡、微型卡
 * 2.3 第三步：实体类的优化 将通话套餐类和上网套餐类中相同的特征和行为提取出来组成抽象套餐类。
 * 2.4 第四步：创建并实现以下接口
 * （1）通话服务接口 抽象方法: 参数 1: 通话分钟, 参数 2: 手机卡类对象 让通话套餐类实现通话服务接口。
 * （2）上网服务接口 抽象方法: 参数 1: 上网流量, 参数 2: 手机卡类对象 让上网套餐类实现上网服务接口。
 */

package com.hucsmn.phone;

/**
 * 手机卡类。
 */
public class Card {
    /**
     * 卡类型
     */
    private CardKind kind;

    /**
     * 卡号
     */
    private int phoneCode;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 密码
     */
    private String passWord;

    /**
     * 账户余额
     */
    private double balance;

    /**
     * 通话时长(分钟)
     */
    private double duration;

    /**
     * 上网流量。
     */
    private long traffic;

    public Card() {
    }

    public Card(CardKind kind, int phoneCode, String userName, String passWord, double balance, double duration, long traffic) {
        setKind(kind);
        setPhoneCode(phoneCode);
        setUserName(userName);
        setPassWord(passWord);
        setBalance(balance);
        setDuration(duration);
        setTraffic(traffic);
    }

    /**
     * 显示（卡号 + 用户名 + 当前余额）。
     */
    public void show() {
        System.out.println("卡号 " + getPhoneCode() + "、用户名 " + getUserName() + "、当前余额 " + getBalance());
    }

    public CardKind getKind() {
        return kind;
    }

    public void setKind(CardKind kind) {
        this.kind = kind;
    }

    public int getPhoneCode() {
        return phoneCode;
    }

    public void setPhoneCode(int phoneCode) {
        if (phoneCode <= 0) {
            throw new IllegalArgumentException();
        }
        this.phoneCode = phoneCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        if (userName.length() == 0) {
            throw new IllegalArgumentException();
        }
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        if (passWord.length() < 6) {
            throw new IllegalArgumentException();
        }
        this.passWord = passWord;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        if (!Double.isFinite(balance)) {
            throw new IllegalArgumentException();
        }
        this.balance = balance;
    }

    public double getDuration() {
        return duration;
    }

    public void setDuration(double duration) {
        if (!Double.isFinite(duration) || duration < 0.0) {
            throw new IllegalArgumentException();
        }
        this.duration = duration;
    }

    public long getTraffic() {
        return traffic;
    }

    public void setTraffic(long traffic) {
        if (traffic < 0) {
            throw new IllegalArgumentException();
        }
        this.traffic = traffic;
    }
}
